www.gusucode.com > vc++ 远程控制示例源程序-源码程序 > vc++ 远程控制示例源程序-源码程序\code\PeerYouS\PeerFileOperator.cpp
// PeerFileOperator.cpp: implementation of the PeerFileOperator. // Download by http://www.NewXing.com ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "PeerFileOperator.h" #include "command.h" #include "peersocket.h" #include "shellapi.h" ////////得到驱动器名称////////////// bool PeerFileGetDriver(SOCKET s,WSAEVENT hEvent) { DWORD retLen; DRIVER driver; ///////////发送//////////////// char sdriver[10]; int count=0; int maskdriver; int drivertype; if(!(maskdriver=GetLogicalDrives())) return false; for(int i=0;i<26;i++) { if(!(maskdriver>>i)) //得到所有驱动器号 break; if(maskdriver>>i&1) { sdriver[0]=i+'A'; sdriver[1]=':'; sdriver[2]=0; drivertype=GetDriveType(sdriver); strcpy(driver.driver,sdriver); driver.drivertype=drivertype; PeerSendDataS(s,(char*)&driver,sizeof(driver),&retLen, hEvent,SENDRECV_TIMEOUT); } } return true; } //////得到文件及其属性 bool PeerFileGetAttrib(SOCKET s,WSAEVENT hEvent) { DWORD retLen; HANDLE hFile; FILEATTRIB attrib; WIN32_FIND_DATA WFD; //得到需返回那个目录的文件信息 if(!PeerRecvDataS(s,(char*)&attrib,sizeof(attrib),&retLen, hEvent,SENDRECV_TIMEOUT)) return false; //查找第一个文件 if((hFile=FindFirstFile(attrib.filename,&WFD))==INVALID_HANDLE_VALUE) return false; SHFILEINFO shfi; DWORD len; char slen[32]; char stime[32]; SYSTEMTIME systime; FILETIME localtime; memset(&shfi,0,sizeof(shfi)); //得到文件的相关信息 SHGetFileInfo(WFD.cFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(shfi), SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME ); //写入文件信息结构 strcpy(attrib.filename,WFD.cFileName); strcpy(attrib.attrib,WFD.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"文件夹":shfi.szTypeName); len=(WFD.nFileSizeHigh*MAXDWORD+WFD.nFileSizeLow)/1024; sprintf(slen,"%dK",len); strcpy(attrib.len,WFD.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"":slen); //转化格林时间到本地时间 FileTimeToLocalFileTime(&WFD.ftLastWriteTime,&localtime); FileTimeToSystemTime(&localtime,&systime); sprintf(stime,"%4d-%02d-%02d %02d:%02d:%02d", systime.wYear,systime.wMonth,systime.wDay,systime.wHour, systime.wMinute,systime.wSecond); strcpy(attrib.time,stime); //发送第一个文件信息 if(strcmp(WFD.cFileName,".")!=0&& strcmp(WFD.cFileName,"..")!=0) PeerSendDataS(s,(char*)&attrib,sizeof(attrib),&retLen, hEvent,SENDRECV_TIMEOUT); while(hFile) { //查完所有信息 if(FindNextFile(hFile,&WFD)) { if(strcmp(WFD.cFileName,".")==0|| strcmp(WFD.cFileName,"..")==0) continue; memset(&shfi,0,sizeof(shfi)); SHGetFileInfo(WFD.cFileName, FILE_ATTRIBUTE_NORMAL, &shfi, sizeof(shfi), SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME ); strcpy(attrib.filename,WFD.cFileName); strcpy(attrib.attrib,WFD.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"文件夹":shfi.szTypeName); len=(WFD.nFileSizeHigh*MAXDWORD+WFD.nFileSizeLow)/1024; sprintf(slen,"%dK",len); strcpy(attrib.len,WFD.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"":slen); FileTimeToLocalFileTime(&WFD.ftLastWriteTime,&localtime); FileTimeToSystemTime(&localtime,&systime); sprintf(stime,"%4d-%02d-%02d %02d:%02d:%02d", systime.wYear,systime.wMonth,systime.wDay,systime.wHour, systime.wMinute,systime.wSecond); strcpy(attrib.time,stime); PeerSendDataS(s,(char*)&attrib,sizeof(attrib),&retLen, hEvent,SENDRECV_TIMEOUT); } else { if(GetLastError()==ERROR_NO_MORE_FILES) break; } } FindClose(hFile); return true; } /////保存发送过来的文件/////////////////// bool PeerFileSave(SOCKET s,WSAEVENT hEvent) { char buf[4096]; bool iffalse=false; DWORD retLen; FILEINFO fi; while(1) { if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen, hEvent,SENDRECV_TIMEOUT)||retLen!=sizeof(fi)) return false; FILE *fp; if(!(fp=fopen(fi.filename,"wb+"))) return false; DWORD dwGetSize=0; while(dwGetSize<fi.filesize) { if(fi.filesize-dwGetSize>4096) { if(!PeerRecvDataS(s,buf,4096,&retLen, hEvent,SENDRECV_TIMEOUT)) { fclose(fp); DeleteFile(fi.filename); return false; } else if(fwrite(buf,sizeof(char),4096,fp)!=4096) { fclose(fp); DeleteFile(fi.filename); return false; } else dwGetSize+=4096; } else { if(!PeerRecvDataS(s,buf,fi.filesize-dwGetSize,&retLen, hEvent,SENDRECV_TIMEOUT)) { fclose(fp); DeleteFile(fi.filename); return false; } else if(fwrite(buf,sizeof(char),fi.filesize-dwGetSize,fp)!=fi.filesize-dwGetSize) { fclose(fp); DeleteFile(fi.filename); return false; } else dwGetSize+=fi.filesize-dwGetSize; } } fclose(fp); } return true; } /////////////发送文件到客户端/////////////// bool PeerFileSend(SOCKET s,WSAEVENT hEvent) { char buf[4096]; DWORD retLen; FILEINFO fi; while(1) { if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen, hEvent,SENDRECV_TIMEOUT)||retLen!=sizeof(fi)) return false; FILE *fp; if(!(fp=fopen(fi.filename,"rb"))) return false; DWORD dwGetSize=0; if(fseek(fp,0l,SEEK_END)) { fclose(fp); return false; } if((dwGetSize=ftell(fp))==-1) { fclose(fp); return false; } if(fseek(fp,0l,SEEK_SET)) { fclose(fp); return false; } fi.filesize=dwGetSize; if(!PeerSendDataS(s,(char*)&fi,sizeof(fi),&retLen,hEvent)) { fclose(fp); return false; } DWORD fcount; while((fcount=fread(buf,sizeof(char),4096,fp))) { if(!PeerSendDataS(s,buf,fcount,&retLen,hEvent,SENDRECV_TIMEOUT)||retLen!=fcount) { fclose(fp); return false; } } fclose(fp); } return true; } /////创建文件夹 bool PeerFileDirCreate(SOCKET s,WSAEVENT hEvent) { DWORD retLen; FILEINFO fi; COMMAND com; if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen, hEvent,SENDRECV_TIMEOUT)||retLen!=sizeof(fi)) return false; if(::CreateDirectory(fi.filename,NULL)) { com.CommandID=PEER_CFM_OK; } else { com.CommandID=PEER_CFM_ERR; } PeerSendDataS(s,(char*)&com,sizeof(com),&retLen, hEvent,SENDRECV_TIMEOUT); return true; } ////////执行程序//////////// bool PeerFileExcute(SOCKET s,WSAEVENT hEvent) { DWORD retLen; FILEINFO fi; if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen, hEvent,SENDRECV_TIMEOUT)||retLen!=sizeof(fi)) return false; ShellExecute(NULL, "open", fi.filename, NULL,NULL, SW_SHOWNORMAL); return true; } /////////删除文件或目录////////////// bool PeerFileDelete(SOCKET s,WSAEVENT hEvent) { DWORD retLen; FILEINFO fi; COMMAND com; while(1) { if(!PeerRecvDataS(s,(char*)&fi,sizeof(fi),&retLen, hEvent,SENDRECV_TIMEOUT)||retLen!=sizeof(fi)) return false; if(fi.dir) { if(RemoveDirectory(fi.filename)) com.CommandID=PEER_CFM_OK; else com.CommandID=PEER_CFM_ERR; } else { if(DeleteFile(fi.filename)) com.CommandID=PEER_CFM_OK; else com.CommandID=PEER_CFM_ERR; } PeerSendDataS(s,(char*)&com,sizeof(com),&retLen, hEvent,SENDRECV_TIMEOUT); } return true; }